"""
python 的函数参数

必须参数： 调用函数时必须要传入参数，并且传入参数的顺序也要一致。
关键字参数： 使用关键字可以不按函数定义时的参数顺序传入参数。
默认参数： 在函数定义时我们可以给函数添加默认值，在调用时没有传入参数就是用默认参数。
可变参数： 在定义函数时候不能确定使用时候的参数个数和内容时候就可以使用可变参数。

"""


# 必须参数
def add(a, b):
    print("a+b= ", a + b)


# 关键字型参数
def person(name, age):
    print("姓名：", name, "\n年龄：", age)


# 默认参数
def default_args(name="wsp", age="24"):
    print("名字：", name, "年龄：", age)


# 可变参数
def function_args_one(*args):
    print(args)


# 可变参数2
def function_args_two(**kwargs):
    print(kwargs)


# 组合可变参数3
def function_args_three(*args, **kwargs):
    print(args, kwargs)


add(99, 100)
person("su", 18)
default_args()
function_args_one("su", 19, "南昌")
function_args_two(name='苏', age=28, location="上饶")
function_args_three(1, 2, 3, 4, name="苏", age=23)
"""

关键字型参数参数可以不按照函数定义时候的顺序赋值，可变参数 * args参数获取到的是一个元组，
这也是它能作为卡变参数的原因。 ** kwargs 参数获取到是一个字典,再调用函数的时候就要使用关键字的方式来传递参数。
"""

"""
函数返回值
"""


# 返回单一值
def add(a, b):
    print("a+b=", a + b)
    return a + b


# 返回多值
def function_string():
    str1 = "苏"
    str2 = "昌"
    str3 = "武"
    return str1, str2, str3


print(add(2, 2))
s1, s2, s3 = function_string()
print("s1:{0},s2:{1},s3:{2}".format(s1, s2, s3))

"""
变量作用域
在函数内赋值的变量，一般不做特殊声明的变量都是局部变量；在函数外赋值的变量就是全局变量。
如果想要对函数外的变量进行修改的话，这个时候我们可以使用global关键字
"""

# 全局变量
str4 = "外部参数1"
str5 = "外部参数2"


def function_param():
    global str4
    str4 = "外部参数1变内部参数1"
    str5 = "内部参数2"
    print(str4)
    print(str5)


function_param()
print(str4)
print(str5)

"""
lambda表达式
形式：以lambda开头，之后以":"分为两部分，左边为函数参数，右边为返回值
"""
f = lambda x, y: x + y
z = f(88, 99)
print(z)
